import axios1 from 'axios'
import store from '@/store'
// import { Notify } from 'vant'
import to from '@/utils/awaitTo'
import { refreshTokenApi } from '@/api'
// import router from '@/router'
// import { setStorage } from '@/storage'
// 把to函数请过来-让它包装住axios请求, 把结果处理成数组再返回到业务页面中
// axios.defaults.baseURL = 'http://toutiao-app.itheima.net'
// axios.defaults.baseURL = 'http://api-toutiao-web.itheima.net/app'
// export default axios // 让外面使用带基地址的axios方法
var JSONbig = require('json-bigint')({ storeAsString: true })
const axios = axios1.create({
  baseURL: 'http://toutiao-app.itheima.net',
  // baseURL: 'http://api-toutiao-web.itheima.net/app'
  transformResponse: [function (data) { // data事后台返回的json字符串
    // console.log(data)
    // 不用json。parse因为她处理不了大数
    // jsonBig.parse可以处理大数
    if (data.length !== 0) {
      return JSONbig.parse(data)
    } else {
      return ''
    }
  }]
})

// 添加请求拦截器
axios.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  if (store.state.token) {
    config.headers.Authorization = 'Bearer ' + store.state.token
  }
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
axios.interceptors.response.use(function (response) {
  // 对响应数据做点什么
  return response
}, async function (error) { // 报错4xx/5xx进入这里
  if (error?.response?.status === 401) {
    // Notify({ type: 'danger', message: 'token过期，请重新登录' })
    // setTimeout(() => {
    //   router.push({
    //     name: 'login'
    //   })
    // }, 1000)

    // 重新刷新token, 再次发送请求
    const [, res] = await refreshTokenApi()
    console.log(res)
    store.commit('setToken', res.data.data.token)
    // setStorage('token', res.data.data.token)
    // 重要: 把headers的Authorization的值换成新的正确的, 再发送刚才报401的请求一次
    error.config.headers.Authorization = res.data.data.token
    return axios(error.config)
  }
  // 对响应错误做点什么
  return Promise.reject(error)
})
export default ({ url, method = 'GET', data = {}, headers = {}, params = {} }) => {
  const PromiseA = axios({
    url,
    method,
    data,
    headers,
    params
  })
  return to(PromiseA)
  // 假如替换了请求库
  //   return new Promise((resolve, reject) => {
  //     // 如果有params写js原生代码, 把params对象里的值, 拼接到url后面去
  //     $.ajax({
  //       url,
  //       type: method,
  //       data,
  //       headers,
  //       success (res) {
  //         resolve(res)
  //       },
  //       error (err) {
  //         reject(err)
  //       }
  //     })
  //   })
}
